package Sintactico;

import java.util.HashMap;

import Sintactico.VarCons.TipoVar;

/*
 * Clase para las funciones semanticas y las restricciones contextuales 
 */
public class Comprobar {
	
	//Atributo
	private HashMap<String, TipoVar[][]> tablaOp;
	
	/**
	 * configura el string que nos dice la operacion q es
	 */
	public Comprobar(){
		tablaOp = new HashMap<String, TipoVar[][]>();
		tablaOp.put("asignacion",this.getAsig());
		tablaOp.put("comp",this.getComp());
		tablaOp.put("aritmeticas",this.getArit());
		tablaOp.put("logica",this.getLog());
		tablaOp.put("despl",this.getDspl());
	}
	
	/**
	 * Restricciones acordes con las tablas de la memoria
	 * @return
	 */
	public TipoVar[][] getAsig(){
		TipoVar[][] tabla= new TipoVar[6][6];
		
		tabla[0][0]=TipoVar.natural;
		tabla[0][1]=TipoVar.error;
		tabla[0][2]=TipoVar.error;		
		tabla[0][3]=TipoVar.error;
		tabla[0][4]=TipoVar.error;
		tabla[0][5]=TipoVar.error;
				
		tabla[1][0]=TipoVar.integer;
		tabla[1][1]=TipoVar.integer;
		tabla[1][2]=TipoVar.error;
		tabla[1][3]=TipoVar.error;
		tabla[1][4]=TipoVar.error;
		tabla[1][5]=TipoVar.error;
				
		tabla[2][0]=TipoVar.floAt;
		tabla[2][1]=TipoVar.floAt;
		tabla[2][2]=TipoVar.floAt;
		tabla[2][3]=TipoVar.error;
		tabla[2][4]=TipoVar.error;
		tabla[2][5]=TipoVar.error;
				
		tabla[3][0]=TipoVar.error;
		tabla[3][1]=TipoVar.error;
		tabla[3][2]=TipoVar.error;
		tabla[3][3]=TipoVar.character;
		tabla[3][4]=TipoVar.error;
		tabla[3][5]=TipoVar.error;
				
		tabla[4][0]=TipoVar.error;
		tabla[4][1]=TipoVar.error;
		tabla[4][2]=TipoVar.error;
		tabla[4][3]=TipoVar.error;
		tabla[4][4]=TipoVar.booleano;
		tabla[4][5]=TipoVar.error;
		
		tabla[5][0]=TipoVar.error;
		tabla[5][1]=TipoVar.error;
		tabla[5][2]=TipoVar.error;
		tabla[5][3]=TipoVar.error;
		tabla[5][4]=TipoVar.error;
		tabla[5][5]=TipoVar.error;
		return tabla;
	}
	
	public TipoVar[][] getComp(){
		TipoVar[][] tabla= new TipoVar[6][6];
		
		tabla[0][0]=TipoVar.booleano;
		tabla[0][1]=TipoVar.booleano;
		tabla[0][2]=TipoVar.booleano;		
		tabla[0][3]=TipoVar.error;
		tabla[0][4]=TipoVar.error;
		tabla[0][5]=TipoVar.error;
				
		tabla[1][0]=TipoVar.booleano;
		tabla[1][1]=TipoVar.booleano;
		tabla[1][2]=TipoVar.booleano;
		tabla[1][3]=TipoVar.error;
		tabla[1][4]=TipoVar.error;
		tabla[1][5]=TipoVar.error;
				
		tabla[2][0]=TipoVar.booleano;
		tabla[2][1]=TipoVar.booleano;
		tabla[2][2]=TipoVar.booleano;
		tabla[2][3]=TipoVar.error;
		tabla[2][4]=TipoVar.error;
		tabla[2][5]=TipoVar.error;
				
		tabla[3][0]=TipoVar.error;
		tabla[3][1]=TipoVar.error;
		tabla[3][2]=TipoVar.error;
		tabla[3][3]=TipoVar.booleano;
		tabla[3][4]=TipoVar.error;
		tabla[3][5]=TipoVar.error;
				
		tabla[4][0]=TipoVar.error;
		tabla[4][1]=TipoVar.error;
		tabla[4][2]=TipoVar.error;
		tabla[4][3]=TipoVar.error;
		tabla[4][4]=TipoVar.booleano;
		tabla[4][5]=TipoVar.error;
		
		tabla[5][0]=TipoVar.error;
		tabla[5][1]=TipoVar.error;
		tabla[5][2]=TipoVar.error;
		tabla[5][3]=TipoVar.error;
		tabla[5][4]=TipoVar.error;
		tabla[5][5]=TipoVar.error;
		return tabla;
	}
	
	public TipoVar[][] getArit(){
		TipoVar[][] tabla= new TipoVar[6][6];
		
		tabla[0][0]=TipoVar.natural;
		tabla[0][1]=TipoVar.integer;
		tabla[0][2]=TipoVar.floAt;		
		tabla[0][3]=TipoVar.error;
		tabla[0][4]=TipoVar.error;
		tabla[0][5]=TipoVar.error;
				
		tabla[1][0]=TipoVar.integer;
		tabla[1][1]=TipoVar.integer;
		tabla[1][2]=TipoVar.floAt;
		tabla[1][3]=TipoVar.error;
		tabla[1][4]=TipoVar.error;
		tabla[1][5]=TipoVar.error;
				
		tabla[2][0]=TipoVar.floAt;
		tabla[2][1]=TipoVar.floAt;
		tabla[2][2]=TipoVar.floAt;
		tabla[2][3]=TipoVar.error;
		tabla[2][4]=TipoVar.error;
		tabla[2][5]=TipoVar.error;
				
		tabla[3][0]=TipoVar.error;
		tabla[3][1]=TipoVar.error;
		tabla[3][2]=TipoVar.error;
		tabla[3][3]=TipoVar.error;
		tabla[3][4]=TipoVar.error;
		tabla[3][5]=TipoVar.error;
				
		tabla[4][0]=TipoVar.error;
		tabla[4][1]=TipoVar.error;
		tabla[4][2]=TipoVar.error;
		tabla[4][3]=TipoVar.error;
		tabla[4][4]=TipoVar.error;
		tabla[4][5]=TipoVar.error;
		
		tabla[5][0]=TipoVar.error;
		tabla[5][1]=TipoVar.error;
		tabla[5][2]=TipoVar.error;
		tabla[5][3]=TipoVar.error;
		tabla[5][4]=TipoVar.error;
		tabla[5][5]=TipoVar.error;
		return tabla;
	}
	
	public TipoVar[][] getLog(){
		TipoVar[][] tabla= new TipoVar[6][6];
		
		tabla[0][0]=TipoVar.error;
		tabla[0][1]=TipoVar.error;
		tabla[0][2]=TipoVar.error;		
		tabla[0][3]=TipoVar.error;
		tabla[0][4]=TipoVar.error;
		tabla[0][5]=TipoVar.error;
				
		tabla[1][0]=TipoVar.error;
		tabla[1][1]=TipoVar.error;
		tabla[1][2]=TipoVar.error;
		tabla[1][3]=TipoVar.error;
		tabla[1][4]=TipoVar.error;
		tabla[1][5]=TipoVar.error;
				
		tabla[2][0]=TipoVar.error;
		tabla[2][1]=TipoVar.error;
		tabla[2][2]=TipoVar.error;
		tabla[2][3]=TipoVar.error;
		tabla[2][4]=TipoVar.error;
		tabla[2][5]=TipoVar.error;
				
		tabla[3][0]=TipoVar.error;
		tabla[3][1]=TipoVar.error;
		tabla[3][2]=TipoVar.error;
		tabla[3][3]=TipoVar.error;
		tabla[3][4]=TipoVar.error;
		tabla[3][5]=TipoVar.error;
				
		tabla[4][0]=TipoVar.error;
		tabla[4][1]=TipoVar.error;
		tabla[4][2]=TipoVar.error;
		tabla[4][3]=TipoVar.error;
		tabla[4][4]=TipoVar.booleano;
		tabla[4][5]=TipoVar.error;
		
		tabla[5][0]=TipoVar.error;
		tabla[5][1]=TipoVar.error;
		tabla[5][2]=TipoVar.error;
		tabla[5][3]=TipoVar.error;
		tabla[5][4]=TipoVar.error;
		tabla[5][5]=TipoVar.error;
		return tabla;
	}
	public TipoVar[][] getDspl(){
		TipoVar[][] tabla= new TipoVar[6][6];
		
		tabla[0][0]=TipoVar.natural;
		tabla[0][1]=TipoVar.error;
		tabla[0][2]=TipoVar.error;		
		tabla[0][3]=TipoVar.error;
		tabla[0][4]=TipoVar.error;
		tabla[0][5]=TipoVar.error;
				
		tabla[1][0]=TipoVar.error;
		tabla[1][1]=TipoVar.error;
		tabla[1][2]=TipoVar.error;
		tabla[1][3]=TipoVar.error;
		tabla[1][4]=TipoVar.error;
		tabla[1][5]=TipoVar.error;
				
		tabla[2][0]=TipoVar.error;
		tabla[2][1]=TipoVar.error;
		tabla[2][2]=TipoVar.error;
		tabla[2][3]=TipoVar.error;
		tabla[2][4]=TipoVar.error;
		tabla[2][5]=TipoVar.error;
				
		tabla[3][0]=TipoVar.error;
		tabla[3][1]=TipoVar.error;
		tabla[3][2]=TipoVar.error;
		tabla[3][3]=TipoVar.error;
		tabla[3][4]=TipoVar.error;
		tabla[3][5]=TipoVar.error;
				
		tabla[4][0]=TipoVar.error;
		tabla[4][1]=TipoVar.error;
		tabla[4][2]=TipoVar.error;
		tabla[4][3]=TipoVar.error;
		tabla[4][4]=TipoVar.error;
		tabla[4][5]=TipoVar.error;
		
		tabla[5][0]=TipoVar.error;
		tabla[5][1]=TipoVar.error;
		tabla[5][2]=TipoVar.error;
		tabla[5][3]=TipoVar.error;
		tabla[5][4]=TipoVar.error;
		tabla[5][5]=TipoVar.error;
		return tabla;
	}
	
	public TipoVar matchingAsig(TipoVar t1, TipoVar t2){
		TipoVar[][] tabla=this.tablaOp.get("asignacion");
		return tabla[t1.ordinal()][t2.ordinal()];
	}
	
	public TipoVar dameResultado(TipoVar t1, TipoVar t2, String op){
		String ope="";
		if (op.equals("+")||op.equals("-")||op.equals("*")||op.equals("/")||op.equals("%")){
			ope="aritmeticas";
		}else if (op.equals("==")||op.equals("!=")||op.equals("<")||op.equals(">")||op.equals(">=")||op.equals("<=")){
			ope="comp";
		}else if (op.equals("<<")||op.equals(">>")){
			ope="despl";
		}else if (op.equals("and")||op.equals("or")){
			ope="logica";
		}
		TipoVar tabla[][]=this.tablaOp.get(ope);
		if (tabla!=null){
			return tabla[t1.ordinal()][t2.ordinal()];
		}else return TipoVar.error;
			
	}
}
